/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.dao;

import br.ufc.quixada.adrs.dao.config.PostGresMapConfig;
import br.ufc.quixada.adrs.model.Descarte;
import br.ufc.quixada.adrs.model.Movimentacao;
import br.ufc.quixada.adrs.model.Rebanho;
import br.ufc.quixada.adrs.model.Visita;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 *
 * @author fernando
 */
public class VisitaDAO {

    public synchronized void insert(Visita visita) throws SQLException {
        Long id = proxId();
        visita.setId(id);
        if (visita.getQuestionarioQualitativo() != null) {
            Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxQuestionarioQualitativoId");
            if (l == null) {
                l = 0L;
            }
            visita.getQuestionarioQualitativo().setId(l + 1);
        }
        if (visita.getQuestionarioSanitario() != null) {
            Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxSanitarioId");
            if (l == null) {
                l = 0L;
            }
            visita.getQuestionarioSanitario().setId(l + 1);
        }
        if (visita.getQuestionarioQuantitativo() != null) {
            Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxQuantitativoId");
            if (l == null) {
                l = 0L;
            }
            visita.getQuestionarioQuantitativo().setId(l + 1);

            id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdRebanho");
            if (id == null) {
                id = 0L;
            }
            for (Rebanho r : visita.getQuestionarioQuantitativo().getRebanhos()) {
                r.setId(++id);
            }

            id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdDescarte");
            if (id == null) {
                id = 0L;
            }
            for (Descarte d : visita.getQuestionarioQuantitativo().getDescartes()) {
                d.setId(++id);
            }

            id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxMovimentacaoId");
            if (id == null) {
                id = 0L;
            }
            for (Movimentacao m : visita.getQuestionarioQuantitativo().getMovimentacoes()) {
                m.setId(++id);
            }
        }
        PostGresMapConfig.getSqlMapClient().insert("addVisita", visita);
    }

    public void delete(Long id) throws SQLException {
        PostGresMapConfig.getSqlMapClient().delete("deleteVisita", id);
    }

    public List<Visita> getByProdutorId(Long id) throws SQLException {
        return (List<Visita>) PostGresMapConfig.getSqlMapClient().queryForList("getVisitasByProdutorId", id);
    }

    public List<Visita> getByAdrsId(Long id) throws SQLException {
        return (List<Visita>) PostGresMapConfig.getSqlMapClient().queryForList("getVisitasByAdrsId", id);
    }

    public List<Visita> getByProdutorAndAdrsId(Map ids) throws SQLException {
        return (List<Visita>) PostGresMapConfig.getSqlMapClient().queryForList("getVisitasByProdutorAndAdrsId", ids);
    }

    public List<Visita> getByProdutorAndAdrsIdInPeriod(Map idsAndPeriod) throws SQLException {
        return (List<Visita>) PostGresMapConfig.getSqlMapClient().queryForList("getVisitasByProdutorAndAdrsIdInPeriod", idsAndPeriod);
    }

    public Visita getById(Long id) throws SQLException {
        return (Visita) PostGresMapConfig.getSqlMapClient().queryForObject("getVisitaById", id);
    }

    private Long proxId() throws SQLException {
        Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdVisita");
        if (l == null) {
            l = 0L;
        }
        return l + 1;
    }

    public synchronized void update(Visita visita) throws SQLException {
        if (visita.getQuestionarioQualitativo() != null) {
            Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxQuestionarioQualitativoId");
            if (l == null) {
                l = 0L;
            }
            visita.getQuestionarioQualitativo().setId(l + 1);
        }
        if (visita.getQuestionarioSanitario() != null) {
            Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxSanitarioId");
            if (l == null) {
                l = 0L;
            }
            visita.getQuestionarioSanitario().setId(l + 1);
        }
        if (visita.getQuestionarioQuantitativo() != null) {
            Long l = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxQuantitativoId");
            if (l == null) {
                l = 0L;
            }
            visita.getQuestionarioQuantitativo().setId(l + 1);

            Long id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdRebanho");
            if (id == null) {
                id = 0L;
            }
            for (Rebanho r : visita.getQuestionarioQuantitativo().getRebanhos()) {
                r.setId(++id);
            }

            id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxIdDescarte");
            if (id == null) {
                id = 0L;
            }
            for (Descarte d : visita.getQuestionarioQuantitativo().getDescartes()) {
                d.setId(++id);
            }

            id = (Long) PostGresMapConfig.getSqlMapClient().queryForObject("getMaxMovimentacaoId");
            if (id == null) {
                id = 0L;
            }
            for (Movimentacao m : visita.getQuestionarioQuantitativo().getMovimentacoes()) {
                m.setId(++id);
            }
        }
        PostGresMapConfig.getSqlMapClient().update("updateVisita", visita);
    }
}
